package com.maochang.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:jdbc.properties")
@ComponentScan("com.maochang")
@Import(JDBCConfig.class)
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true)//是否是cglib动态代理 默认是false,可以改为ture
public class SpringConfig {
    /**
     * javaConfig方式配置事务管理器
     * @param dataSource
     * @return
     */
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager(@Autowired DataSource dataSource){
          //1.创建事务管理器对象
          DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager();
          //2.注入数据源
          dataSourceTransactionManager.setDataSource(dataSource);
          return  dataSourceTransactionManager;
      }

    /**
     * 一、半注解开发
     *    1.xml中声明数据源
     *    2.xml中声明事务管理器，并注入数据源
     *    3.@ComponentScan("com.maochang")开启扫包模式
     *    4.设置事务管理器,注入数据源
     *    5.<tx:annotation-driven transactionmanager="transactionManager"></tx:annotation-driven>
     *          开启事务注解扫描,将使用@Treansactional注解所标识的方法或类中所有的方法使用事务进行管理,
     *          transactionmanager设置事务管理器的id
     *    6.<aop:aspectj-autoproxy></aop:aspectj-autoproxy>是否开启cglib动态代理
     *    7.@Transactional业务类上添加事务注解
     * 二、全注解开发
     *    1.@Configuration声明配置类
     *    2.@PropertySource导入数据配置信息
     *    3.@ComponentScan("com.maochang")开启扫包模式
     *    4.@EnableTransactionManagement开启事务注解 等同于<tx:annotation-driven transactionmanager="transactionManager"></tx:annotation-driven>
     *    5.@EnableAspectJAutoProxy(proxyTargetClass = true) 等同于<aop:aspectj-autoproxy></aop:aspectj-autoproxy> 是否开启cglib动态代理
     *    6.导入@Import导入JDBC配置文件（这里边配置的是数据源）
     *    7.@Bean配置事务管理器注入数据源
     *    8.@Transactional业务类上添加事务注解
     * 三、xml版本
     *    1.导入外部属性文件  <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
     *    2.数据库连接池
     *    3.配置JdbcTemplate
     *    4.组件扫描 <context:component-scan base-package="com.maochang"></context:component-scan>
     *    5.配置事务管理器
     *        注入事务管理器的数据源
     *    6.配置使用Cglib动态代理 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
     *    7.配置通知
     *    8.配置切入点和切面
     */
}
